home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-desktop-9.10-i386-PL.iso / casper / filesystem.squashfs / usr / lib / pm-utils / sleep.d / 99video < prev   
Text File  |  2009-10-06  |  6KB  |  220 lines

  1. #!/bin/sh
  2. #
  3. # Copyright 2006-2007 Richard Hughes <richard@hughsie.com>
  4. # Copyright 2007 Peter Jones <pjones@redhat.com>
  5. #
  6. # This program is free software; you can redistribute it and/or modify
  7. # it under the terms of version 2 of the GNU General Public License as
  8. # published by the Free Software Foundation.
  9.  
  10. # Handle video quirks.  If you are having suspend/resume issues,
  11. # troubleshooting using this hook is probably the best place to start.
  12. # If it weren't for video card quirks, suspend/resume on Linux would be 
  13. # a whole lot more stable.
  14.  
  15. . "${PM_FUNCTIONS}"
  16.  
  17. for opt in $PM_CMDLINE; do
  18.     case "${opt##--quirk-}" in # just quirks, please
  19.         dpms-on)        QUIRK_DPMS_ON="true" ;;
  20.         dpms-suspend)        QUIRK_DPMS_SUSPEND="true" ;;
  21.         radeon-off)        QUIRK_RADEON_OFF="true" ;;
  22.         reset-brightness)  QUIRK_RESET_BRIGHTNESS="true" ;;
  23.         s3-bios)        QUIRK_S3_BIOS="true" ;;
  24.         s3-mode)        QUIRK_S3_MODE="true" ;;
  25.         vbe-post)        QUIRK_VBE_POST="true" ;;
  26.         vbemode-restore)   QUIRK_VBEMODE_RESTORE="true" ;;
  27.         vbestate-restore)  QUIRK_VBESTATE_RESTORE="true" ;;
  28.         vga-mode3)        QUIRK_VGA_MODE_3="true" ;;
  29.         no-fb)            QUIRK_NOFB="true" ;;
  30.         pci-save)        QUIRK_PCI_SAVE="true" ;;
  31.             no-chvt)           QUIRK_NO_CHVT="true" ;;
  32.         none)            QUIRK_NONE="true" ;;
  33.         *) continue ;;
  34.     esac
  35. done
  36.  
  37. reset_brightness()
  38. {
  39.     for bl in /sys/class/backlight/* ; do
  40.         [ -f "$bl/brightness" ] || continue
  41.         BR="$(cat $bl/brightness)"
  42.         echo 0 > "$bl/brightness"
  43.         echo "$BR" > "$bl/brightness"
  44.     done
  45. }
  46.  
  47. if command_exists vbetool; then
  48.     vbe() { vbetool "$@"; }
  49. else 
  50.     vbe() { echo "vbetool not installed!" 1>&2; return 1; }
  51. fi
  52.  
  53. if command_exists radeontool; then
  54.     radeon() { radeontool "$@"; }
  55. else 
  56.     radeon() { echo "radeontool not found" 1>&2; return 1; }
  57. fi
  58.  
  59. die_if_framebuffer() 
  60.     [ -d "/sys/class/graphics/fb0" ] || return
  61.     echo "--quirk-no-fb passed, but system is using a framebuffer."
  62.     echo "Aborting."
  63.     exit 1
  64. }
  65.  
  66.  
  67. save_fbcon()
  68. {
  69.     local con
  70.     for con in /sys/class/graphics/*/state; do
  71.         [ -f $con ] || continue
  72.         echo 1 >"${con}"
  73.     done
  74. }
  75.  
  76. resume_fbcon()
  77. {
  78.     local con
  79.     for con in /sys/class/graphics/*/state; do
  80.         [ -f $con ] || continue
  81.         echo 0 >"${con}"
  82.     done
  83. }
  84.  
  85. maybe_chvt()
  86. {
  87.     [ "$QUIRK_NO_CHVT" = "true" ] && return
  88.     fgconsole |savestate console
  89.     chvt 63
  90. }
  91.  
  92. maybe_deallocvt()
  93. {
  94.     state_exists console || return
  95.     chvt $(restorestate console)
  96.     deallocvt 63
  97. }
  98.  
  99. # Some tiny helper functions for quirk handling
  100. quirk() { [ "$1" = "true" ] && [ -z $QUIRK_NONE ]; }
  101.  
  102. # save/restore vbe state
  103. vbe_savestate() { vbe vbestate save |savestate vbestate; }
  104. vbe_restorestate() { restorestate vbestate |vbe vbestate restore; }
  105.  
  106. # save/restore the vbe mode
  107. vbe_savemode() { vbe vbemode get |savestate vbemode; }
  108. vbe_restoremode() 
  109. {
  110.     # this is a little mode complicated to handle special-casing mode 3.
  111.     local vbemode=$(restorestate vbemode)
  112.     if [ "$vbemode" = "3" ]; then
  113.         vbe vgamode set $vbemode
  114.     else 
  115.         vbe vbemode set $vbemode
  116.     fi
  117. }
  118.  
  119. # post the video card
  120. vbe_post() 
  121. {
  122.     local rom="/var/run/video.rom"
  123.     # if we do not have a romfile, do not post with it.
  124.     [ -f "$rom" ] || unset rom
  125.     vbe post $rom
  126.     sleep 0.1 
  127. }
  128.  
  129. # turn critical bits of radeon cards off/on
  130. radeon_off() { radeon dac off; radeon light off; }
  131. radeon_on() { radeon dac on; radeon light on; }
  132.  
  133. # save and restore video card PCI config state
  134. save_pci() 
  135. {
  136.     local pci="/sys/bus/pci/devices"
  137.     for dev in "${pci}"/*; do
  138.         [ -f "${dev}/class" ] || continue
  139.         [ $(cat "${dev}/class") = "0x030000" ] || continue
  140.         [ -f "${dev}/config" ] || continue
  141.         # it is a video card, it has a configuration.  Save it.
  142.         savestate "pci_video_${dev##*/}" <${dev}/config
  143.     done
  144. }
  145.  
  146. restore_pci() 
  147. {
  148.     local pci="/sys/bus/pci/devices"
  149.     for dev in "${pci}"/*; do
  150.         state_exists "pci_video_${dev##*/}" || continue
  151.         restorestate "pci_video_${dev##*/}" > "${dev}/config"
  152.     done
  153. }
  154.  
  155. suspend_video()
  156. {
  157.     # 0=nothing, 1=s3_bios, 2=s3_mode, 3=both
  158.     local acpi_flag=0
  159.     quirk "${QUIRK_S3_BIOS}" &&         acpi_flag=$(($acpi_flag + 1))
  160.     quirk "${QUIRK_S3_MODE}" &&         acpi_flag=$(($acpi_flag + 2))
  161.     sysctl -w kernel.acpi_video_flags=$acpi_flag
  162.     
  163.     quirk "${QUIRK_NOFB}" &&         die_if_framebuffer
  164.     quirk "${QUIRK_VBESTATE_RESTORE}" &&     vbe_savestate
  165.     quirk "${QUIRK_VBEMODE_RESTORE}" &&     vbe_savemode
  166.     quirk "${QUIRK_RADEON_OFF}" &&         radeon_off
  167.     quirk "${QUIRK_PCI_SAVE}" &&         pci_save
  168.     quirk "${QUIRK_VGA_MODE_3}" &&         vbe vbemode set 3
  169.     quirk "${QUIRK_DPMS_SUSPEND}" &&     vbe dpms suspend
  170.     save_fbcon
  171. }
  172. resume_video()
  173. {
  174.     # We might need to do one or many of these quirks
  175.     quirk "${QUIRK_PCI_SAVE}" &&         pci_restore
  176.     quirk "${QUIRK_VBE_POST}" &&         vbe_post
  177.     quirk "${QUIRK_VBESTATE_RESTORE}" &&     vbe_restorestate
  178.     quirk "${QUIRK_VBEMODE_RESTORE}" &&     vbe_restoremode
  179.     resume_fbcon     # also should be handled by a quirk.
  180.     quirk "${QUIRK_RADEON_OFF}" &&         radeon_on
  181.     quirk "${QUIRK_DPMS_ON}" &&         vbe dpms on
  182.     quirk "${QUIRK_RESET_BRIGHTNESS}" &&     reset_brightness
  183.     return 0  # avoid spurious hook exit failure message.
  184. }
  185.  
  186. help() {
  187.     echo  # first echo makes it look nicer.
  188.     echo "Video quirk handler options:"
  189.     echo
  190.     echo "  --quirk-dpms-on"
  191.     echo "  --quirk-dpms-suspend"
  192.     echo "  --quirk-radeon-off"
  193.     echo "  --quirk-reset-brightness"
  194.     echo "  --quirk-s3-bios"
  195.     echo "  --quirk-s3-mode"
  196.     echo "  --quirk-vbe-post"
  197.     echo "  --quirk-vbemode-restore"
  198.     echo "  --quirk-vbestate-restore"
  199.     echo "  --quirk-vga-mode3"
  200.     echo "  --quirk-none"
  201. }
  202.  
  203. case "$1" in
  204.     suspend) maybe_chvt; suspend_video ;;
  205.     hibernate) maybe_chvt
  206.         if [ "$HIBERNATE_RESUME_POST_VIDEO" = "yes" ]; then
  207.             suspend_video
  208.         fi
  209.         ;;
  210.     resume) resume_video; maybe_deallocvt;;
  211.     thaw)
  212.         if [ "${HIBERNATE_RESUME_POST_VIDEO}" = "yes" ]; then
  213.             resume_video
  214.         fi
  215.         maybe_deallocvt
  216.         ;;
  217.     help) help ;;
  218. esac
  219.